/*
 * @Author: wwssaabb
 * @Date: 2021-12-10 10:57:49
 * @LastEditTime: 2021-12-10 11:42:18
 * @FilePath: \handwritten-code\algorithm\反转字符串中的单词 III.js
 */

/* 
给定一个字符串， 你需要反转字符串中每个单词的字符顺序， 同时仍保留空格和单词的初始顺序。

示例：
输入： "Let's take LeetCode contest"
输出： "s'teL ekat edoCteeL tsetnoc"

来源： 力扣（ LeetCode）
链接： https: //leetcode-cn.com/problems/reverse-words-in-a-string-iii
*/

//api
var reverseWords = function (s) {
  return s.split(' ').map(str => str.split('').reverse().join('')).join(' ')
};

//栈，不是空格的字符串代表单词入栈，遇到空格时单词出栈，出栈时字母顺序就是反转了字符串顺序
//时间空间都为O(n)
var reverseWords = function (s) {
  let res = '',
    stack = []
  for (let i = 0; i < s.length + 1; i++) {
    if (s[i] === ' ' || i === s.length) { //出栈
      console.log(stack)
      let str = ''
      while (stack.length) str += stack.pop()
      res += (res !== '' ? ' ' + str : str)
    } else { //入栈
      stack.push(s[i])
    }
  }
  return res
}

//双指针，获取每一个单词的范围，然后反转单词
var reverseWords = function (s) {
  s = s.split('')
  let l = r = 0,
    temp
  for (let i = 0; i < s.length + 1; i++) {
    //找空格，找到后反转单词再设置指针为下一个单词的开始
    if (s[i] === ' ' || i === s.length) {
      r = i - 1
      while (l < r) {
        console.log(s)
        temp = s[l]
        s[l] = s[r]
        s[r] = temp
        l++
        r--
      }
      l = r = i + 1
    }
  }
  return s.join('')
}

console.log(reverseWords("Let's take LeetCode contest"))